﻿using RStudio.UIFramwork.Pool;
using RStudio.UIFramwork.Utils;
using System;
using System.Collections.Generic;
using UnityEngine;


namespace RStudio.UIFramwork
{
    /// <summary>
    /// 模块|界面实例
    /// </summary>
    public class UIModuleInstance
    {
        /// <summary>
        /// 在用库
        /// </summary>
        public readonly Dictionary<Type, GameObject> UICache;

        public UIModuleInstance()
        {
            UICache = new Dictionary<Type, GameObject>();
        }

        /// <summary>
        /// 预加载并缓存 UI 原型
        /// </summary>
        /// <param name="type">UI 类型（如 typeof(UIMainPanel)）</param>
        /// <param name="prefabPath">预制体资源路径</param>
        public void PreLoad(Type type)
        {
            #region 原型 本地缓存检查
            bool isContain = UICache.ContainsKey(type);
            if (isContain)
            {
                //Debug.LogWarning($"UI 原型已缓存：{type.Name}，无需重复加载");
                return;
            }
            #endregion

            # region 原型 模型源有效性检查
            bool isGet = UIAssetUtil.IsUIDetailAttached(type, out UIDetailAttribute uiDetail);
            if (!isGet) return;
            string prefabPath = uiDetail.AssetLink;
            GameObject prefab = AssetLoaderManager.Instance.Load<GameObject>(prefabPath);
            if (prefab == null)
            {
                Debug.LogError($"加载 UI 原型失败，路径不存在：{prefabPath}");
                return;
            }
            #endregion

            #region 原型 添加缓存+池准备

            if (!prefab.TryGetComponent<UIBase>(out var uiBase))
            {
                Debug.LogError($"UI 原型缺少 类{type.Name}");
                return;
            }

            // 缓存对象
            // 执行生命周期
            // 开辟对象关联池
            UICache[type] = prefab;
            uiBase.CreateUI();
            UnitPoolCenter.Create(type, prefab);
            #endregion
        }

        /// <summary>
        /// 卸载并移除指定类型的 UI 原型缓存
        /// </summary>
        public void UnLoad(Type type)
        {
            if (UICache.TryGetValue(type, out GameObject prefab))
            {
                // 移除缓存
                // 执行生命周期
                // 清理对象关联池
                UICache.Remove(type);

                if (prefab.TryGetComponent(out UIBase uiBase))
                {
                    uiBase.DisposeUI();
                }

                UnitPoolCenter.Dispose(type);
            }
        }

        /// <summary>
        /// 清空所有 UI 原型缓存
        /// </summary>
        public void Dispose()
        {
            UICache.Clear();
            UnitPoolCenter.Instance.Dispose();
        }
    }
}
